package com.example.util;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class CustomDateDeserializer extends JsonDeserializer<Date> {

    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        // 处理 JSON 字段为 null 的情况
        if (p.getValueAsString() == null) {
            return null;
        }

        String dateStr = p.getText().trim();

        // 处理空字符串
        if (dateStr.isEmpty()) {
            return null; // 或返回默认日期（如 new Date(0)）
        }

        // 解析日期
        try {
            // 优先处理 ISO 8601 格式（带时区）
            SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
            isoFormat.setLenient(false); // 严格模式，拒绝无效日期
            return isoFormat.parse(dateStr);
        } catch (ParseException e) {
            try {
                // 处理普通格式（yyyy-MM-dd HH:mm:ss）
                SimpleDateFormat normalFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                normalFormat.setLenient(false);
                return normalFormat.parse(dateStr);
            } catch (ParseException ex) {
                // 处理仅日期格式（yyyy-MM-dd）
                try {
                    SimpleDateFormat dateOnlyFormat = new SimpleDateFormat("yyyy-MM-dd");
                    dateOnlyFormat.setLenient(false);
                    Date date = dateOnlyFormat.parse(dateStr);
                    // 转换为当天 00:00:00（可选）
                    date.setHours(0);
                    date.setMinutes(0);
                    date.setSeconds(0);
                    return date;
                } catch (ParseException ex2) {
                    throw new IllegalArgumentException("Invalid date format: " + dateStr, ex2);
                }
            }
        }
    }
}
